#include <algorithm>
#include <cstdint>
#include <iostream>
#include <istream>
#include <limits>
#include <vector>

using ll = int64_t;

ll n,a,b,ans=std::numeric_limits<ll>::max();
std::vector<std::vector<ll>> dp;
constexpr ll idxa = 6000+7;

static inline __attribute__((always_inline)) ll& getdp(ll i,ll j){
    return dp[i%2][j+idxa];
}

int main(){
    std::iostream::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::cout.tie(nullptr);

    std::cin>>n;
    dp.resize(2,std::vector<ll>(2*idxa+1,std::numeric_limits<ll>::max()-7));
    getdp(0, 0)=0;
    for(ll i=1;i<=n;i++){
        /*
            i=前i个 <=1000
            j=当前的差值  -6000<=j<=6000
            k为最小翻转次数 <=1000
            dp[i][j]=k
            O(1000*12000)=1e7
        */
        std::cin>>a>>b;
        for(ll j=6000;j>=-6000;j--){
            getdp(i, j)=std::min(getdp(i, j),getdp(i-1, j-(a-b)));
            getdp(i, j)=std::min(getdp(i, j),getdp(i-1, j-(-a+b))+1);
        }
        dp[i%2==1?0:1].assign(2*idxa+1,std::numeric_limits<ll>::max()-7);
    }
    for(ll i=0;i<=6000;i++){
        if(getdp(n, i)<=1000){
            std::cout<<getdp(n, i)<<'\n';
            break;
        }else if(getdp(n, -i)<=1000){
            std::cout<<getdp(n, -i)<<'\n';
            break;
        }
    }
}